import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from './types/index';
import xhr from './xhr';
import { buildURL } from './helpers/url';
import { transformRequest, transformResponse } from './helpers/data';
import { processHeaders } from './helpers/headers';

// const axios = (config: AxiosRequestConfig) => {
//   processConfig(config)
//   xhr(config);
// }

function axios(config: AxiosRequestConfig): AxiosPromise {
    processConfig(config)
   return xhr(config).then(res => {
     return transformResponseData(res)
   })
}

function processConfig(config: AxiosRequestConfig): void {
  config.url = transformURL(config)
  // 需要先处理headers，因为transformRequestData中将data转成字符串
  config.headers = transformHeaders(config);
  config.data = transformRequestData(config)
}

// 处理params
function transformURL(config: AxiosRequestConfig): string {
  const { url, params } = config;
  return buildURL(url, params)
}

// 处理data参数
function transformRequestData(config: AxiosRequestConfig): any {
  return transformRequest(config.data)
}

// 处理headers
function transformHeaders(config: AxiosRequestConfig):void {
  const { data, headers = {} } = config
  return processHeaders(headers, data);
}

// 对应响应数据是json字符串： 则转成json对象
// 当请求接口 不设置`responseType`时，会返回json字符串
function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data)
  return res
}
export default axios